package Window;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

/**
 * Clase abstracta que representa un diagrama, padre de las clases de los
 * diagramas de los tests de Nemenyi y Bonferroni-Dunn
 * 
 * @author Adrian Bellido Exposito
 */

public class JTablero extends JPanel{

    /////////////////////////////////////////////////////////////////
    // CONSTANTE DE SERIALIZACION
    /////////////////////////////////////////////////////////////////

    /** Generada por Eclipse */
    
    private static final long serialVersionUID = 263971044933206287L;

    /////////////////////////////////////////////////////////////////
    // VARIABLES PRIVADAS
    /////////////////////////////////////////////////////////////////

    /** Ancho del diagrama */

    private int width_;

    /** Altura del diagrama */

    private int height_;
    
    /** Imagen del tablero */
    
    BufferedImage tableroImage_;
    
    /** Imagen dama blanca casilla blanca*/
    
    BufferedImage damaBlancaCB_;
    
    /** Imagen dama blanca casilla negra*/
    
    BufferedImage damaBlancaCN_;
    
    /** Imagen dama blanca doble casilla blanca*/
    
    BufferedImage dama2BlancaCB_;
    
    /** Imagen dama blanca doble casilla negra*/
    
    BufferedImage dama2BlancaCN_;
    
    /** Imagen dama negra casilla blanca*/
    
    BufferedImage damaNegraCB_;
    
    /** Imagen dama blanca casilla negra*/
    
    BufferedImage damaNegraCN_;
    
    /** Imagen dama negra doble casilla blanca*/
    
    BufferedImage dama2NegraCB_;
    
    /** Imagen dama blanca doble casilla negra*/
    
    BufferedImage dama2NegraCN_;
    
    /** Lado casilla */
    int ladoCasilla_;
    
    /** Coordenadas de la esquina superior izquierda tablero */
    int xT_, yT_;
    
    /** Matriz tipo string con las piezas en el tablero */
    String [][] piezasTablero_;


    /////////////////////////////////////////////////////////////////
    // CONSTRUCTORES
    /////////////////////////////////////////////////////////////////

    /**
     * Constructor vacio
     */

    public JTablero(String [][] piezasTablero) {
	super();

	// Damos unos valores a la altura y anchura lo suficientemente
	// grandes
	width_ = 302;
	height_ = 302;
	
	// Damos valores a las variables auxiliares
	ladoCasilla_ = 32;
	xT_ = yT_ = 23;
	piezasTablero_ = piezasTablero.clone();
	
	// Leemos las distintas imagenes necesarias
	URL auxURL = null;
	try {
	    auxURL = (new File("src/imagenes/tableroDamas.png")).toURI().toURL();
	    tableroImage_ = ImageIO.read(auxURL);
	    auxURL = (new File("src/imagenes/damaBlancaCB.png")).toURI().toURL();
	    damaBlancaCB_ = ImageIO.read(auxURL);
	    auxURL = (new File("src/imagenes/damaBlancaCN.png")).toURI().toURL();
	    damaBlancaCN_ = ImageIO.read(auxURL);
	    auxURL = (new File("src/imagenes/damaNegraCB.png")).toURI().toURL();
	    damaNegraCB_ = ImageIO.read(auxURL);
	    auxURL = (new File("src/imagenes/damaNegraCN.png")).toURI().toURL();
	    damaNegraCN_ = ImageIO.read(auxURL);
	    auxURL = (new File("src/imagenes/dama2BlancaCB.png")).toURI().toURL();
	    dama2BlancaCB_ = ImageIO.read(auxURL);
	    auxURL = (new File("src/imagenes/dama2BlancaCN.png")).toURI().toURL();
	    dama2BlancaCN_ = ImageIO.read(auxURL);
	    auxURL = (new File("src/imagenes/dama2NegraCB.png")).toURI().toURL();
	    dama2NegraCB_ = ImageIO.read(auxURL);
	    auxURL = (new File("src/imagenes/dama2NegraCN.png")).toURI().toURL();
	    dama2NegraCN_ = ImageIO.read(auxURL);
	} catch (MalformedURLException e) {
	    // TODO Auto-generated catch block
	    e.printStackTrace();
	} catch (IOException e) {
	    // TODO Auto-generated catch block
	    e.printStackTrace();
	}
    }

    /////////////////////////////////////////////////////////////////
    // FUNCIONES PUBLICAS
    /////////////////////////////////////////////////////////////////

    /**
     * Actualiza el contenido del grafico
     * 
     * @param g
     *            Contenido del diagrama
     */

    public void update(Graphics g) {
	paint(g);
    }

    /**
     * Pinta el contenido del grafico llamando a paintComponent.
     * 
     * @param g
     *            Contenido del diagrama
     */

    public void paint(Graphics g)  {
	Graphics2D g2 = (Graphics2D) g;
	
	// Pintamos el fondo de blanco
	g2.setColor(Color.WHITE);
	g2.fillRect(0, 0, getWidth(), getHeight());
	
	// Pintamos el tablero
	g2.drawImage(tableroImage_, 0, 0,  tableroImage_.getWidth(null), tableroImage_.getHeight(null), 0, 0, tableroImage_.getWidth(null), tableroImage_.getHeight(null), null);
    
	// Pintamos las piezas
	String pieza;
	for(int i=0; i<8; i++){
	    for(int j=0; j<8; j++){
		pieza = piezasTablero_[i][j];
		if(!pieza.equals(""))
			ponerPieza(g2, j, i, pieza);
	    }
	}
    }

    /**
     * Devuelve la anchura total del panel
     * 
     * @return La altura total del diagrama como int
     */
    
    public int getWidth() {
	return width_;
    }

    /**
     * Devuelve la altura total del panel
     * 
     * @return La altura total del diagrama como int
     */

    public int getHeight() {
	return height_;
    }

    /**
     * Define la anchura del panel
     * 
     * @param width
     *            Anchura del panel
     */

    public void setWidth(int width) {
	width_ = width;
    }

    // FUNCIONES PRIVADAS
    
    void ponerPieza(Graphics2D g2, int casillaX, int casillaY, String pieza){
	// Calculamos la posición de la pieza en la imagen
	int x = (casillaX*ladoCasilla_)+xT_;
	int y = (casillaY*ladoCasilla_)+yT_;
	
	// Vamos si la pieza es dama o no y si la casilla es blanca y negra
	// Casilla blanca y pieza negra
	if(pieza.equals("n") && ((casillaX+casillaY)%2 == 0))
	    g2.drawImage(damaNegraCB_, x, y, ladoCasilla_+x, ladoCasilla_+y, 0, 0, ladoCasilla_, ladoCasilla_, null);
	// Casilla negra y pieza negra
	else if(pieza.equals("n") && ((casillaX+casillaY)%2 != 0))
	    g2.drawImage(damaNegraCN_, x, y, ladoCasilla_+x, ladoCasilla_+y, 0, 0, ladoCasilla_, ladoCasilla_, null);
	// Casilla blanca y pieza blanca
	else if(pieza.equals("b") && ((casillaX+casillaY)%2 == 0))
	    g2.drawImage(damaBlancaCB_, x, y, ladoCasilla_+x, ladoCasilla_+y, 0, 0, ladoCasilla_, ladoCasilla_, null);
	// Casilla negra y pieza blanca
	else if(pieza.equals("b") && ((casillaX+casillaY)%2 != 0))
	    g2.drawImage(damaBlancaCN_, x, y, ladoCasilla_+x, ladoCasilla_+y, 0, 0, ladoCasilla_, ladoCasilla_, null);
	
	// DAMAS DOBLES
	
	// Casilla blanca y pieza negra
	if(pieza.equals("N") && ((casillaX+casillaY)%2 == 0))
	    g2.drawImage(dama2NegraCB_, x, y, ladoCasilla_+x, ladoCasilla_+y, 0, 0, ladoCasilla_, ladoCasilla_, null);
	// Casilla negra y pieza negra
	else if(pieza.equals("N") && ((casillaX+casillaY)%2 != 0))
	    g2.drawImage(dama2NegraCN_, x, y, ladoCasilla_+x, ladoCasilla_+y, 0, 0, ladoCasilla_, ladoCasilla_, null);
	// Casilla blanca y pieza blanca
	else if(pieza.equals("B") && ((casillaX+casillaY)%2 == 0))
	    g2.drawImage(dama2BlancaCB_, x, y, ladoCasilla_+x, ladoCasilla_+y, 0, 0, ladoCasilla_, ladoCasilla_, null);
	// Casilla negra y pieza blanca
	else if(pieza.equals("B") && ((casillaX+casillaY)%2 != 0))
	    g2.drawImage(dama2BlancaCN_, x, y, ladoCasilla_+x, ladoCasilla_+y, 0, 0, ladoCasilla_, ladoCasilla_, null);
	
    }


}